# -*- coding:utf-8 -*-
import wiringpi as gpio
import time

'''
电路             树莓派接口
行：
    SI   -------> 11 #行扫描数据输入口
    OE   -------> 12 #行扫描输出控制口（低电平输出有效）
    STCP -------> 13 #输出至存储器时钟（低电平变高电平时，更新数据）
    SHCP -------> 15 #数据移位时钟（低电平变高电平时，位移数据）
列：
    SI   -------> 16 #列扫描数据输入
    STCP -------> 18 #同（13引脚）
    SHCP -------> 7  #同（15引脚）
调压：
    ABL  -------> 22 #控制电压使用

电平转换器  A1      A2      A3      A4      A5      A6      A7      A8
40针物理口  07      11      12      13      15      16      18      22
wiringpi口   7       0       1       2       3       4       5       6
元器件对应  行SI    行OE    行STCP  行SHCP  列SI    列SHCP  列STCP   电压

'''
used_pin = range(8)
p_volt = 6  # 电压引脚
pin_rowsi, pin_oe, pin_rowstcp, pin_rowshcp = 7, 0, 1, 2
pin_colsi, pin_colstcp, pin_colshcp = 3, 5, 4
delay_s = 1

def led_init():
    if gpio.wiringPiSetup() == -1:
        print('数据口初始化错误')
        exit
    for pin in used_pin:
        gpio.pinMode(pin, gpio.OUTPUT)
    gpio.digitalWrite(pin_oe, gpio.LOW)
    gpio.digitalWrite(p_volt, gpio.LOW)

def send_data595(ctrl_dw=0, bit=8, pin_si=pin_rowsi, pin_shcp=pin_rowshcp, pin_stcp=pin_rowstcp):
    bin_dw = bin(ctrl_dw)[2:].zfill(bit)  # 转换为2进制
    #print(bin_dw)
    for item in bin_dw:
        gpio.digitalWrite(pin_shcp, gpio.LOW)  # 写低
        gpio.delayMicroseconds(delay_s)  # 1微秒
        if item == '0':
            gpio.digitalWrite(pin_si, gpio.LOW)  # 写数据位
        else:
            gpio.digitalWrite(pin_si, gpio.HIGH)  # 写数据位
        gpio.delayMicroseconds(delay_s)  # 1微秒
        gpio.digitalWrite(pin_shcp, gpio.HIGH)  # 写入
    gpio.delayMicroseconds(delay_s)  # 1ms
    gpio.digitalWrite(pin_si, gpio.LOW)#为抗干扰，拉低
    gpio.digitalWrite(pin_shcp, gpio.LOW)#为抗干扰，拉低
    gpio.digitalWrite(pin_stcp, gpio.LOW)  # 写低
    gpio.delayMicroseconds(delay_s)  # 1ms
    gpio.digitalWrite(pin_stcp, gpio.HIGH)  # 写高
    gpio.delayMicroseconds(delay_s)  # 1ms
    gpio.digitalWrite(pin_stcp, gpio.LOW)#为抗干扰，拉低


if __name__ == '__main__':
    led_init()
    #gpio.digitalWrite(pin_oe, gpio.HIGH)
    send_data595(0x00)
    # 动画1，一平面灯滚动动画

    for i in range(7):
        send_data595(0xff, 8, pin_colsi, pin_colstcp, pin_colshcp)  # 直接传入64个二进制位
    send_data595(0xaf, 8, pin_colsi, pin_colshcp, pin_colstcp)  # 直接传入64个二进制位
    #flag = [0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe]
    #gpio.digitalWrite(pin_oe, gpio.LOW)




